class Watcher {
    // vm: vue实例
    // key: 监控的属性键值
    // cb: 回调函数，执行具体更新
    constructor(vm, key, cb) {
        this.vm = vm
        this.key = key
        this.cb = cb

        // 指定在这个执行环境下的watcher实例
        Dep.target = this
        // 获取旧的数据，触发get方法中Dep.addSub
        this.oldValue = vm[key]
        // 删除target，等待下一次赋值
        Dep.target = null
    }

    update() {
        let newValue = this.vm[this.key]
        if (this.oldValue === newValue) {
            return
        }
        this.cb(newValue)
        this.oldValue = newValue
    }
}